import { getStore, setStore } from "@/util/store";
import { isURL, validatenull } from "@/util/validate";
import {
  getUserInfo,
  loginByUsername,
  logout,
  refreshToken
} from "@/api/login";
import { deepClone, encryption } from "@/util/util";
import webiste from "@/const/website";
import { getMenu } from "@/api/admin/menu";
import { getTenantBySuffix } from "@/api/admin/tenant";

function addPath (ele, first) {
  const menu = webiste.menu;
  const propsConfig = menu.props;
  const propsDefault = {
    label: propsConfig.label || "name",
    path: propsConfig.path || "path",
    icon: propsConfig.icon || "icon",
    children: propsConfig.children || "children"
  };
  const icon = ele[propsDefault.icon];
  ele[propsDefault.icon] = validatenull(icon) ? menu.iconDefault : icon;
  const isChild =
    ele[propsDefault.children] && ele[propsDefault.children].length !== 0;
  if (!isChild) ele[propsDefault.children] = [];
  if (!isChild && first && !isURL(ele[propsDefault.path])) {
    ele[propsDefault.path] = ele[propsDefault.path] + "/index";
  } else {
    ele[propsDefault.children].forEach(child => {
      addPath(child);
    });
  }
}

const user = {
  state: {
    userInfo: {},
    permissions: {},
    roles: [],
    tenantId: null,
    menu:
      getStore({
        name: "menu"
      }) || [],
    menuAll: [],
    expires_in:
      getStore({
        name: "expires_in"
      }) || "",
    access_token:
      getStore({
        name: "access_token"
      }) || "",
    refresh_token:
      getStore({
        name: "refresh_token"
      }) || ""
  },
  actions: {
    // 根据用户名登录
    LoginByUsername ({ commit }, userInfo) {
      const user = encryption({
        data: userInfo,
        key: "thanks,pig4cloud",
        param: ["password"]
      });
      return new Promise((resolve, reject) => {
        loginByUsername(
          userInfo.username,
          userInfo.password,
          userInfo.code,
          userInfo.randomStr
        )
          .then(response => {
            const data = response.data;
            commit("SET_ACCESS_TOKEN", data.obj.access_token);
            commit("SET_REFRESH_TOKEN", data.obj.refresh_token);
            commit("SET_EXPIRES_IN", data.obj.expires_in);
            commit("CLEAR_LOCK");
            resolve();
          })
          .catch(error => {
            reject(error);
          });
      });
    },
    // 根据后缀获取租户id
    GetTenantIdBySuffix ({ commit }, suffix) {
      return new Promise((resolve, reject) => {
        getTenantBySuffix(suffix)
          .then(response => {
            const data = response.data;
            let tenantId = data.obj.id || null;
            console.log(tenantId);
            commit("SET_TENANT_ID", tenantId);
            resolve();
          })
          .catch(err => {
            reject();
          });
      });
    },
    GetUserInfo ({ commit }) {
      return new Promise((resolve, reject) => {
        getUserInfo()
          .then(res => {
            const data = res.data.obj || {};
            commit("SET_USER_INFO", data.fastUser);
            commit("SET_ROLES", data.roleCodes || []);
            commit("SET_PERMISSIONS", data.authorities || []);
            resolve(data);
          })
          .catch(err => {
            reject();
          });
      });
    },
    // 刷新token
    RefreshToken ({ commit, state }) {
      return new Promise((resolve, reject) => {
        refreshToken(state.refresh_token)
          .then(response => {
            const data = response.data;
            commit("SET_ACCESS_TOKEN", data.access_token);
            commit("SET_REFRESH_TOKEN", data.refresh_token);
            commit("SET_EXPIRES_IN", data.expires_in);
            commit("CLEAR_LOCK");
            resolve();
          })
          .catch(error => {
            reject(error);
          });
      });
    },
    // 登出
    LogOut ({ commit }) {
      return new Promise((resolve, reject) => {
        logout()
          .then(() => {
            commit("SET_MENU", []);
            commit("SET_PERMISSIONS", []);
            commit("SET_USER_INFO", {});
            commit("SET_ACCESS_TOKEN", "");
            commit("SET_REFRESH_TOKEN", "");
            commit("SET_EXPIRES_IN", "");
            commit("SET_ROLES", []);
            commit("DEL_ALL_TAG");
            commit("CLEAR_LOCK");
            resolve();
          })
          .catch(error => {
            reject(error);
          });
      });
    },
    // 注销session
    FedLogOut ({ commit }) {
      return new Promise(resolve => {
        commit("SET_MENU", []);
        commit("SET_PERMISSIONS", []);
        commit("SET_USER_INFO", {});
        commit("SET_ACCESS_TOKEN", "");
        commit("SET_REFRESH_TOKEN", "");
        commit("SET_ROLES", []);
        commit("DEL_ALL_TAG");
        commit("CLEAR_LOCK");
        resolve();
      });
    },
    // 获取系统菜单
    GetMenu ({ commit }, obj) {
      return new Promise(resolve => {
        getMenu(obj.id).then(res => {
          const data = res.data.obj;
          let menu = deepClone(data);
          menu.forEach(ele => {
            addPath(ele);
          });
          let type = obj.type;
          commit("SET_MENU", { type, menu });
          resolve(menu);
        });
      });
    }
  },
  mutations: {
    SET_TENANT_ID: (state, tenantId) => {
      state.tenantId = tenantId;
      setStore({
        name: "tenantId",
        content: state.tenantId,
        type: "session"
      });
    },
    SET_ACCESS_TOKEN: (state, access_token) => {
      state.access_token = access_token;
      setStore({
        name: "access_token",
        content: state.access_token,
        type: "session"
      });
    },
    SET_EXPIRES_IN: (state, expires_in) => {
      state.expires_in = expires_in;
      setStore({
        name: "expires_in",
        content: state.expires_in,
        type: "session"
      });
    },
    SET_REFRESH_TOKEN: (state, rfToken) => {
      state.refresh_token = rfToken;
      setStore({
        name: "refresh_token",
        content: state.refresh_token,
        type: "session"
      });
    },
    SET_USER_INFO: (state, userInfo) => {
      state.userInfo = userInfo;
    },
    SET_MENU: (state, params = {}) => {
      let { menu, type } = params;
      if (type !== false) state.menu = menu;
      setStore({
        name: "menu",
        content: menu,
        type: "session"
      });
    },
    SET_MENU_ALL: (state, menuAll) => {
      state.menuAll = menuAll;
    },
    SET_ROLES: (state, roles) => {
      state.roles = roles;
    },
    SET_PERMISSIONS: (state, permissions) => {
      const list = {};
      for (let i = 0; i < permissions.length; i++) {
        list[permissions[i]] = true;
      }
      state.permissions = list;
    }
  }
};
export default user;
